--- %%NOBANNER%% -->
/*-------------------<---Start of Description-->---------------------\
| PURPOSE: creates index, simple or composite, if it does not exist |
| : Checks whether the variables entered by the user exist |
| : in the data set. It exits with a message if one of the |
| : vars entered by the user does not exist in the data set |
| USAGE : %crindex(lr,ds,vars) |
|---------------------<---End of Description-->----------------------|
|--------------------------------------------------------------------|
|------------<---Start of Files or Arguments Needed-->---------------|
| Auguments and Variables: |
| lr : libref |
| ds : data set name |
| vars : vars to index; vars separated by spaces |
| varscom : vars separated by commas, not spaces |
| indxname: name of the index to create |
| ixnames : list of existing indexes on the data set |
| _i_ : counter |
| v : one of the vars variables |
|-------------<---End of Files or Arguments Needed-->----------------|
|--------------------------------------------------------------------|
|------------------<---Start of Files Created-->---------------------|
| Example: %crindex(sasuser,class,race) |
| %crindex(sasuser,class,race sex ed) |
| %crindex(sasuser,class,race sex ede) |
| Usage: %crindex(libname=,indata=,vars=, outdata=&indata); |
\-------------------<---End of Files Created-->---------------------*/
%macro crindex(libname=,indata=,vars=, outdata=&indata);
/*--------------------------------------------\
| Author: Duo Zhou; |
| Created: 8-27-2001 9:30pm; |
| Purpose: Create index of variables in a |
| dataset; |
\--------------------------------------------*/
%*-- %put libname=&libname indata=&indata vars=&vars;
%local indxname ixnames _i_ varscom;
%let libname=%upcase(&libname);
%let indata=%upcase(&indata);
%let vars=%upcase(&vars);
%if &outdata eq %then %do;
%let outdata=&indata;
%end;
%*-------- Check if var exists in the data set;
%*-------- and generate a name for the simple/composite index;
proc sql noprint;
select name into :allv separated by " "
from dictionary.columns
where libname="&libname" and memname="&indata"
;
quit;
%put ........................ allv=&allv;
%let indxname=;
%let _i_=1;
%let v=%qscan(&vars,&_i_);
%do %while(%length(&v) gt 0);
%if %sysfunc(indexw(&allv,&v)) eq 0 %then %do;
%put .............. &v does not exist in the data set: &libname..&indata;
%put .............. Exiting this program;
%goto finish;
%end;
%let indxname=&indxname.%substr(&v,1,1);
%put indxname=&indxname;
%let _i_=%eval(&_i_+1);
%let v=%scan(&vars,&_i_);
%if &_i_>8 %then %let v=;
%end;
%if &_i_=2 %then %let indxname=&vars;
%*-- Check if index already exists;
%let ixnames=;
proc sql noprint;
select distinct indxname into :ixnames separated by " "
from dictionary.indexes
where libname="&libname" and memname="&indata"
;
quit;
%*--- %put Existing indexes are: &ixnames;
%*--- %put Name of index to create is: &indxname;
%if %index(&ixnames, %upcase(&indxname))=0 %then
%do;
%*--- %put index &indxname does not exist;
%*-- introduce commas into vars to get varscom;
%let varscom=%sysfunc(translate(&vars,","," "));
%put ................. vars=&vars;
%put ................. varscom=&varscom;
proc sql noprint;
create index &indxname on &libname..&outdata(&varscom);
%put --> Note: Index created: &indxname.. ;
quit;
%end;
%else %put --> Note: Index &indxname already exists! ;
%finish:
%mend crindex;